package cl.ncx.cmvrc.persistence.bean.autoridad;

import java.util.List;

import javax.ejb.EJBException;
import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.jboss.logging.Logger;

import cl.ncx.cmvrc.persistence.base.entities.personas.Autoridad;
import cl.ncx.cmvrc.persistence.base.entities.personas.InstitucionAutoridad;

@Stateless(mappedName=IAutoridadSession.JNDI_NAME)
@Local({AutoridadSessionLocal.class})
@Remote({AutoridadSessionRemote.class})

public class AutoridadSessionBean implements AutoridadSessionLocal, AutoridadSessionRemote {
	
	@PersistenceContext(unitName="cmvrcPU")
	private EntityManager entityManager;
	
	private final static Logger logger = Logger.getLogger(AutoridadSessionBean.class);
	

	@Override
	public Autoridad ingresarNuevaAutoridad(Autoridad autoridad)
			throws EJBException {
		try{
			if(autoridad!= null)
			{
				entityManager.persist(autoridad);
				return autoridad;
			}
			
		}catch(RuntimeException ru)
		{
			ru.getStackTrace();
			new EJBException();
		}
		catch(Exception e)
		{
			logger.info("Fallo metodo: ingresarNuevaAutoridad");
		}
		return null;
	}

	@Override
	public void modificaAutoridad(Autoridad autoridad) throws EJBException {
		
		try{
			if(autoridad!=null)
			{
				entityManager.merge(autoridad);
			}
		}catch(RuntimeException ru)
		{
			ru.getStackTrace();
			new EJBException();
		}
		catch(Exception e)
		{
			logger.info("Fallo metodo: modificaAutoridad");
		}
		
	}

	@Override
	public void deleteAutoridad(Autoridad autoridad) throws EJBException {
		
		try{
			if(autoridad!=null)
			{
				entityManager.remove(autoridad);
			}
		}catch(RuntimeException ru)
		{
			ru.getStackTrace();
			new EJBException();
		}
		catch(Exception e)
		{
			logger.info("Fallo metodo: deleteAutoridad");
		}
		
	}
	
	
	public Autoridad findAutoridadById(Integer autoridadId) throws EJBException {
		try{
			if(autoridadId!=null){
				Autoridad a = entityManager.find(Autoridad.class, autoridadId);
				return a;
			}
		}catch (Exception e) {
			e.printStackTrace();
			throw new EJBException(e);
		}
		return null;
	}
	
	@SuppressWarnings("unchecked")
	public List<Autoridad> findAllAutoridades()throws EJBException
	{
		try{
			String queryString = 	"SELECT autoridad" +
									"FROM Autoridad autoridad ";
			Query query = entityManager.createQuery(queryString);
			return query.getResultList();
		}
		catch(RuntimeException r)
		{
			r.printStackTrace();
		}
		catch (Exception e) {
			e.printStackTrace();
			logger.info("fallo metodo: findAllAutoridades");
		}
		return null;
	}
	
	public Autoridad verificaSiExisteAutoridad(Autoridad aut)throws EJBException
	{
		Autoridad autoridad = null;
		String queryString = "SELECT autoridad FROM Autoridad autoridad WHERE autoridad.persona.rut = :rut AND autoridad.persona.dv = :dv";
		Query query = entityManager.createQuery(queryString);
		query.setParameter("rut", aut.getPersona().getRut());
		query.setParameter("dv", aut.getPersona().getDv());
		try{
			autoridad=(Autoridad)query.getSingleResult();
		}
		catch(Exception e)
		{
			e.getStackTrace();
		}
		
		return autoridad;
	}

	@Override
	public InstitucionAutoridad ingresarNuevaInstitucion(InstitucionAutoridad institucionAutoridad) throws EJBException {
		try{
			if(institucionAutoridad!= null)
			{
				entityManager.persist(institucionAutoridad);
				return institucionAutoridad;
			}
			
		}catch(RuntimeException ru)
		{
			ru.getStackTrace();
			new EJBException();
		}
		catch(Exception e)
		{
			logger.info("Fallo metodo: ingresarNuevaInstitucion");
		}
		return null;
	}

	@Override
	public void modificaInstitucion(InstitucionAutoridad institucionAutoridad)throws EJBException {
		try{
			if(institucionAutoridad!=null)
			{
				entityManager.merge(institucionAutoridad);
			}
		}catch(RuntimeException ru)
		{
			ru.getStackTrace();
			new EJBException();
		}
		catch(Exception e)
		{
			logger.info("Fallo metodo: modificaInstitucion");
		}
		
	}

	@Override
	public void eliminaInstitucion(InstitucionAutoridad institucionAutoridad)throws EJBException {
		try{
			if(institucionAutoridad!=null)
			{
				entityManager.remove(institucionAutoridad);
			}
		}catch(RuntimeException ru)
		{
			ru.getStackTrace();
			new EJBException();
		}
		catch(Exception e)
		{
			logger.info("Fallo metodo: eliminaInstitucion");
		}
		
	}
	
	@Override
	public InstitucionAutoridad findInstitucionById(Integer institucionID)throws EJBException {
		try{
			if(institucionID!=null){
				InstitucionAutoridad institucion = entityManager.find(InstitucionAutoridad.class, institucionID);
				return institucion;
			}
		}catch (Exception e) {
			e.printStackTrace();
			throw new EJBException(e);
		}
		return null;
	}

}
